切换主题
冒泡排序
规则:
- 升序:双重循环遍历数组,一边比较一边向后两两交换,将最大值冒泡到末位
- 降序:双重循环遍历数组,一边比较一边向前两两交换,将最大值冒泡到首位
单向冒泡
JavaScript
const bubbleSort = A => {
const len = A.length - 1
for (let i = 0; i < len; i++) {
let isOk = true
for (let j = 0; j < len - i; j++) { // 后 i+1 个已排序
if (A[j] > A[j + 1]) {
[A[j], A[j + 1]] = [A[j + 1], A[j]]
isOk = false
}
}
if (isOk) break // 无数据交换时,则说明当前数据已排序完成
}
}
稳定性:
若将 第7行 代码中的>
改为>=
,该算法将不再是稳定排序算法!
双向冒泡
JavaScript
const bubbleSort = A => {
let [l, r] = [0, A.length - 1]
while (l < r) {
let isOk = true
for (let i = l; i < r; i++) { // 前 i+1 个已排序
if (A[i] > A[i + 1]) { // 将最大值交换值末位
[A[i], A[i + 1]] = [A[i + 1], A[i]]
isOk = false
}
}
r-- // 每一趟排序完成,末位已排序数+1,故需收缩未排序区间
for (let j = r; j > l; j--) { // 后 j 个已排序
if (A[j] < A[j - 1]) { // 将最小值交换值首位
[A[j], A[j - 1]] = [A[j - 1], A[j]]
isOk = false
}
}
l++ // 每一趟排序完成,首位已排序数+1,故需收缩未排序区间
if (isOk) break // 无数据交换时,则说明当前数据已排序完成
}
}
稳定性:
若将 第7行 第14行 代码中的>
改为>=
,该算法将不再是稳定排序算法!